package acharOndeMetodoEhChamado;

import java.util.HashMap;
import java.util.LinkedList;

public class SingletonGuardaExcecoesESuasSuperclasses {
	private volatile static SingletonGuardaExcecoesESuasSuperclasses singleton;
	private HashMap<String, LinkedList<String>> excecoesESuperclasses;//vem com extensao pai, avo, bisavo...
	
	private SingletonGuardaExcecoesESuasSuperclasses()
	{
		excecoesESuperclasses = new HashMap<String, LinkedList<String>>();
	}
	
	public static synchronized SingletonGuardaExcecoesESuasSuperclasses getInstance()
	{
		if(singleton == null)
		{
			singleton = new SingletonGuardaExcecoesESuasSuperclasses();
		}
		
		return singleton;
	}
	
	public LinkedList<String> pegarSuperclasses(String nomeExcecao)
	{
		LinkedList<String> superclasses = this.excecoesESuperclasses.get(nomeExcecao);
		if(superclasses != null)
		{
			return superclasses;
		}
		else
		{
			return new LinkedList<String>();
		}
	}
	
	public void adicionarNovaSuperclasseDeExcecao(String nomeSuperclasse, String nomeExcecao)
	{
		LinkedList<String> superclassesDaExcecaoJahExistentes =
				this.excecoesESuperclasses.get(nomeExcecao);
		if(superclassesDaExcecaoJahExistentes == null)
		{
			LinkedList<String> herancasDaExcecao = new LinkedList<String>();
			herancasDaExcecao.add(nomeSuperclasse);
			this.excecoesESuperclasses.put(nomeExcecao, herancasDaExcecao);
		}
		else
		{
			superclassesDaExcecaoJahExistentes.add(nomeExcecao);
			this.excecoesESuperclasses.put(nomeExcecao, superclassesDaExcecaoJahExistentes);
		}
	}
	
	public void adicionarSuperclassesDeExcecao(String nomeExcecao, LinkedList<String> superclasses)
	{
		this.excecoesESuperclasses.put(nomeExcecao, superclasses);
	}

}
